package org.example;


import org.example.config.AppConfig;
import org.example.controller.UserController;
import org.example.model.Bean对象1;
import org.example.model.Bean对象2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Spring容器启动类 {

    public static void main(String[] args) {
        //ApplicationContext就是Spring容器的顶级接口
        //AnnotationConfigApplicationContext是其中的一个实现类，它的作用是：
        //（1）扫描指定的包路径下，使用Spring框架注解的类
        //（2）注册这些类到容器中=>框架帮我们new对象，及注入对象的依赖关系(属性赋值)
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
        //获取Bean对象有两种方式：
        //（1）通过bean的类型
        Bean对象1 b1_1 = context.getBean(Bean对象1.class);
        System.out.println(b1_1);

        //（2）通过bean的id（也叫bean的名称,首字母小写）
        Bean对象1 b1_2 = (Bean对象1) context.getBean("bean对象1");//这个方法要强制转换一下
        System.out.println(b1_2);

        //获取注册到容器中的配置类对象
        AppConfig config = context.getBean(AppConfig.class);
        System.out.println(config);

        //@Bean方法注册到容器的对象
        Bean对象2 b2_1 = (Bean对象2) context.getBean("testBean2_1");
        System.out.println(b2_1);
        b2_1.setName("修改后2-1");
        Bean对象2 b2_2 = (Bean对象2) context.getBean("testBean2_2");
        System.out.println(b2_2);
        //@Bean方法注解，注册到容器中，可以是同一个类型的不同实例对象

        //此时，如果通过类型，获取bean对象，就会报错：
        //容器中，一个类型，有多个实例对象，通过类型就不知道获取哪个了
//        Bean对象2 b2_1_byType = context.getBean(Bean对象2.class);
//        System.out.println(b2_1_byType);

        UserController userController = context.getBean(UserController.class);
        System.out.println(userController);
    }
}
